package middlewares

import (
	"net/http"
	"strings"

	models "yuanaiproblem/dao/model"
	"yuanaiproblem/migrations/db"
	jwt "yuanaiproblem/utils" // 替换为实际包路径

	"github.com/gin-gonic/gin"
)

// JwtAuthMiddleware JWT认证中间件
func JwtAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		authHeader := c.GetHeader("Authorization")
		if authHeader == "" {
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "missing authorization header"})
			return
		}
		// 格式应为 "Bearer {token}"
		parts := strings.Split(authHeader, " ")
		if len(parts) != 2 || parts[0] != "Bearer" {
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid authorization format"})
			return
		}

		//获取后面的token
		token := parts[1]
		claims, err := jwt.ParseToken(token)
		if err != nil {
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token: " + err.Error()})
			return
		}
		// 根据UserID查数据库获取完整用户信息
		var user models.User

		if err := db.DB.Where("id = ?", claims.UserID).First(&user).Error; err != nil {
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "user not found"})
			return
		}

		// 将用户信息存入上下文
		c.Set("current_user", user) // 完整用户对象
		c.Next()
	}
}

// AdminRole 管理员角色校验中间件
// 需配合 JwtAuthMiddleware 使用（依赖其存入的 current_user）
func AdminRole() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从上下文获取完整用户对象（JwtAuthMiddleware已存入）
		userVal, exists := c.Get("current_user")
		if !exists {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": "系统错误：未获取到用户信息",
			})
			c.Abort()
			return
		}
		// 类型断言：转换为models.User类型
		user, ok := userVal.(models.User)
		if !ok {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": "系统错误：用户信息格式不正确",
			})
			c.Abort()
			return
		}
		// 检查用户角色是否为管理员
		if user.Role != models.RoleAdmin {
			c.JSON(http.StatusForbidden, gin.H{
				"error": "权限不足：需要管理员权限",
			})
			c.Abort()
			return
		}
		// 验证通过，继续处理请求
		c.Next()
	}
}
